function main() {		
	var collection;
	var traderColl;
	var docEntry;
	var centry;
	var itemAlterCodeID;
	var itemEntryID;
	var itemAlterCode;
	var codeVal;
    var nameVal;
	var cstmID = null;
	var customer;
	var customerID;
	var customerBranch;
	var traderID;
	var trader;
	var traderBranch;
	var line;
	var actLogger;
	var warnings;
	
	var logger = sc$APIContext.GetActionLogger();

	var dic = sc$Context.JsonDeserialize(sc$APIContext.GetImportBuffer());
	traderID = sc$ApplImportScript.FindRecord("heCustomers", true, ["heID"], [dic["CstmID"].toString()], "heTrdrID");
	traderColl = sc$Context.DataObjects.GetMasterByID("Hercules", "Traders", traderID);							
	traderColl.Logic.DisableConstraints();
	trader = traderColl[0];	
	customer = trader.Customers.SearchByField("ID", dic["CstmID"].toString());
	traderBranch = trader.TraderBranches.SearchByField("Name", dic["CsbrName"].toString());
	
		

	collection = sc$Context.DataObjects.NewMaster("Hercules", "SalesEntries");
	collection.Logic.DisableConstraints();
	docEntry = collection[0];

	docEntry.OperationFlags.Add(docEntry.DentOperationFlagEnum.FillValuesMissing);
	docEntry.OperationFlags.Add(docEntry.DentOperationFlagEnum.AddKitItemLines);
	centry = docEntry.ComEntries[0];
	
	docEntry.SetValue("SourceType", 9);
	//centry.SetValue("CmdtType", 2);		// sales orders
	
	if (dic["DocCode"] != null) {
		docEntry.SetValue("DocCode", dic["DocCode"]);
	}
	if (dic["DocNumber"] != null) {
		docEntry.SetValue("DocNum", dic["DocNumber"]);
	}
	
	if (dic["SeriesCode"] != null || dic["SeriesShortcut"] != null) {
        var seriesCode = null;
		var seriesShcut = null;
		
		if (dic["SeriesCode"] != null) {
			seriesCode = dic["SeriesCode"];
		}
		if (dic["SeriesShortcut"] != null) {
			seriesShcut = dic["SeriesShortcut"];
		}
		var seriesID = sc$ApplImportScript.FindSalesSeries(seriesCode, seriesShcut);
		if (seriesID != null) {
			docEntry.SetValue("DcsrID", seriesID);
		}
		else {
			sc$ApplImportScript.RaiseError(60, seriesCode, seriesShcut, dic["@@Signature"]);
		}
    }
	
	if (customer != undefined && customer != null) {
		centry.SetValue("BillCstmID", customer.ID);
	}
	if (customerBranch != undefined && customerBranch != null) {
		centry.SetValue("BillCsbrID", customerBranch.ID);
	}
	
	docEntry.SetValue("CompID", sc$Application.CurrentCompanyID);
	
	var cmbrID = sc$APIContext.GetBranchID();
	if (cmbrID != null) {
		docEntry.SetValue("CmbrID", cmbrID);
	}
	var cbwhID = dic["WarID"];
	if (cbwhID != null) {
		centry.SetValue("CbwhID", cbwhID);
	}
		
	var agentID = dic["agent"];
	if (agentID != null) {
		centry.SetValue("AgntID", agentID);
	}

	if (dic["PmmtCode"] != null || dic["PmmtName"] != null){            
		codeVal = null;
		nameVal = null;
		if (dic["PmmtCode"] != null && dic["PmmtCode"].length > 0) {
			codeVal = dic["PmmtCode"];
		} else if (dic["PmmtName"] != null){					
			nameVal = dic["PmmtName"];
		}
		FindLookupItem(codeVal, nameVal, "hePaymentMethods", "PmmtID", centry);			
	}	
	
	var dicLines = sc$Context.JsonDeserialize(dic["Lines"]);

	for (var i = 0; i < dicLines.Count; i++) {
	
		itemAlterCodeID = null;
		itemEntryID = null;
		codeVal = null;
		nameVal = null;
		
		line = centry.Lines.New();	
		centry.Lines.Add(line);

		if (dicLines[i]["CenlItemCode"] != null || dicLines[i]["CenlItemName"] != null) {	
			codeVal = null;
			nameVal = null;		
			if (dicLines[i]["CenlItemCode"] != null) {				
				var fieldsCode : Array = ["heCode"];
				var valsCode : Array = [dicLines[i]["CenlItemCode"]];
				codeVal = dicLines[i]["CenlItemCode"];
				itemEntryID = sc$ApplImportScript.FindItemsOrServicesRecord(fieldsCode, valsCode, "heID");
			}
			else if (dicLines[i]["CenlItemName"] != null) {
				var fieldsDesc : Array = ["heName"];
				var valsDesc : Array = [dicLines[i]["CenlItemName"]];
				nameVal = dicLines[i]["CenlItemName"];
				itemEntryID = sc$ApplImportScript.FindItemsOrServicesRecord(fieldsDesc, valsDesc, "heID");
			}
			if (itemEntryID != null) {
				line.SetValue("ItemID", itemEntryID);
			}
		}
		if (itemEntryID != null) {
			if (dicLines[i]["CenlItemAlterCode"] !== undefined) {
				var fieldsItemAndAlterCode = ["heItemID", "heCode"];
				var valsItemAndAlterCode = [itemEntryID, dicLines[i]["CenlItemAlterCode"]];
				
				itemAlterCode = dicLines[i]["CenlItemAlterCode"];
				
				// Check whether the itemID and itemAlterCode pair exists only once
				itemAlterCodeID = sc$ApplImportScript.FindRecord("heItemAlterCodes", false, fieldsItemAndAlterCode, valsItemAndAlterCode, "heID");
				if (itemAlterCodeID != null) {
					line.SetValue("ItemID", itemEntryID);	
					line.SetValue("ItacID", itemAlterCodeID);
				}	
				else {
					sc$ApplImportScript.RaiseError(29, codeVal, nameVal, null, null, itemAlterCode, dicLines[i]["@@Signature"]);
				}
			}
		} else {
			if (dicLines[i]["CenlItemAlterCode"] !== undefined) {
				var fieldsAlterCode = ["heCode"];
				var valsAlterCode = [dicLines[i]["CenlItemAlterCode"]];
				
				itemAlterCode = dicLines[i]["CenlItemAlterCode"];
				
				// Check whether itemAlterCode exists only once
				itemAlterCodeID = sc$ApplImportScript.FindRecord("heItemAlterCodes", false, fieldsAlterCode, valsAlterCode, "heID");
				if (itemAlterCodeID != null) {
					line.SetValue("ItacID", itemAlterCodeID);
				}
				else {
					sc$ApplImportScript.RaiseError(30, itemAlterCode, dicLines[i]["@@Signature"]);
				}
			} else {
				sc$ApplImportScript.RaiseError(28, codeVal, nameVal);
			}
		}

		if (dicLines[i]["CenlPrice"] != null) {
			line.SetValue("Price", dicLines[i]["CenlPrice"]);
		}
		
		if (dicLines[i]["CenlAMeasurementQty"] != null) {
			line.SetValue("AQty", dicLines[i]["CenlAMeasurementQty"]);
		}		
		
		line.EndEdit();
	}
	
	centry.EndEdit();	
	docEntry.EndEdit();
	
	sc$Context.DataObjects.ExternalDataFix("Hercules", "SalesEntries", collection);
	actLogger = sc$ApplImportScript.SaveFromImport("Hercules", "SalesEntries", collection);
	logger.Merge(actLogger);
	
	var outDic = new scDictionary();
	outDic["Cookie"]  = sc$APIContext.GetCookie();
	outDic["EntityId"] = docEntry.ID;
	outDic["CustomerId"] = customer.ID;
	outDic["Messages"] = logger;

	return sc$Context.JsonSerialize(outDic);
}

function FindLookupItem(codeVal, nameVal, lookupTable, propName, entity, lookupVersion) {	
	var recID = sc$ApplImportScript.FindArrayCodeNameRecord(lookupTable, codeVal, nameVal, lookupVersion);	
	if (recID != null) {		
		entity.SetValue(propName, recID); 
	}
}